home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyo (Python 2.3)
-
- import thread
- import threading
- import Queue
- import time
- import os
- import cStringIO
- import zipfile
- import re
- from wxPython.wx import *
- from wxPython.lib import colourdb
- from wxPython.help import *
- from wxPython.gizmos import wxTreeListCtrl
- import wxPython.gizmosc as gizmosc
- import guiwidgets
- import common
- import version
- import helpids
- import comdiagnose
- mainthreadid = thread.get_ident()
- helperthreadid = -1
- ID_FILENEW = 1
- ID_FILEOPEN = 1
- ID_FILESAVE = 1
- ID_FILEPRINT = 1
- ID_FILEPRINTPREVIEW = 1
- ID_FILEEXIT = 1
- ID_EDITADDENTRY = 1
- ID_EDITDELETEENTRY = 1
- ID_EDITSETTINGS = 1
- ID_DATAGETPHONE = 1
- ID_DATASENDPHONE = 1
- ID_VIEWLOGDATA = 1
- ID_VIEWFILESYSTEM = 1
- ID_HELPHELP = 1
- ID_HELPCONTENTS = 1
- ID_HELPTOUR = 1
- ID_HELPABOUT = 1
- ID_FV_ICONS = 1
- ID_FV_LIST = 1
- ID_FV_SAVE = 1
- ID_FV_HEXVIEW = 1
- ID_FV_OVERWRITE = 1
- ID_FV_NEWSUBDIR = 1
- ID_FV_NEWFILE = 1
- ID_FV_DELETE = 1
- ID_FV_OPEN = 1
- ID_FV_RENAME = 1
- ID_FV_REFRESH = 1
- ID_FV_PROPERTIES = 1
- ID_FV_ADD = 1
- ID_FV_BACKUP = 1
- ID_FV_BACKUP_TREE = 1
- ID_FV_RESTORE = 1
- ID_FV_PASTE = 1
- idmap = { }
- idnum = 2
- for idmapname in locals().keys():
- if len(idmapname) > 3 and idmapname[0:3] == 'ID_':
- locals()[idmapname] = idnum
- idmap[idnum] = idmapname
- idnum += 1
- continue
-
-
- class Callback:
-
- def __init__(self, method, *args, **kwargs):
- self.method = method
- self.args = args
- self.kwargs = kwargs
-
-
- def __call__(self, *args, **kwargs):
- d = self.kwargs.copy()
- d.update(kwargs)
- apply(self.method, self.args + args, d)
-
-
-
- class Request:
-
- def __init__(self, method, *args, **kwargs):
- self.method = method
- self.args = args
- self.kwargs = kwargs
-
-
- def __call__(self, *args, **kwargs):
- d = self.kwargs.copy()
- d.update(kwargs)
- return apply(self.method, self.args + args, d)
-
-
-
- class HelperReturnEvent(wxPyEvent):
-
- def __init__(self, callback, *args, **kwargs):
- wxPyEvent.__init__(self)
- self.SetEventType(wxEVT_CALLBACK)
- self.cb = callback
- self.args = args
- self.kwargs = kwargs
-
-
- def __call__(self):
- return apply(self.cb, self.args, self.kwargs)
-
-
-
- class WorkerThreadFramework(threading.Thread):
-
- def __init__(self):
- threading.Thread.__init__(self, name = 'BitPim helper')
- self.q = Queue.Queue()
-
-
- def setdispatch(self, dispatchto):
- self.dispatchto = dispatchto
-
-
- def checkthread(self):
- pass
-
-
- def run(self):
- global helperthreadid
- helperthreadid = thread.get_ident()
- first = 1
- while True:
- if not first:
- wxPostEvent(self.dispatchto, HelperReturnEvent(self.dispatchto.endbusycb))
- else:
- first = 0
- item = self.q.get()
- wxPostEvent(self.dispatchto, HelperReturnEvent(self.dispatchto.startbusycb))
- call = item[0]
- resultcb = item[1]
- ex = None
- res = None
-
- try:
- res = call()
- except Exception:
- e = None
- ex = e
- ex.gui_exc_info = sys.exc_info()
-
- wxPostEvent(self.dispatchto, HelperReturnEvent(resultcb, ex, res))
- if isinstance(ex, SystemExit):
- raise ex
- continue
-
-
- def progressminor(self, pos, max, desc = ''):
- wxPostEvent(self.dispatchto, HelperReturnEvent(self.dispatchto.progressminorcb, pos, max, desc))
-
-
- def progressmajor(self, pos, max, desc = ''):
- wxPostEvent(self.dispatchto, HelperReturnEvent(self.dispatchto.progressmajorcb, pos, max, desc))
-
-
- def progress(self, pos, max, desc = ''):
- self.progressminor(pos, max, desc)
-
-
- def log(self, str):
- if self.dispatchto.wantlog:
- wxPostEvent(self.dispatchto, HelperReturnEvent(self.dispatchto.logcb, str))
-
-
-
- def logdata(self, str, data):
- if self.dispatchto.wantlog:
- wxPostEvent(self.dispatchto, HelperReturnEvent(self.dispatchto.logdatacb, str, data))
-
-
-
- thesplashscreen = None
-
- class MySplashScreen(wxSplashScreen):
-
- def __init__(self, app, config):
- global thesplashscreen
- self.app = app
- time = config.ReadInt('splashscreentime', 3000)
- if time > 0:
- bmp = getbitmap('splashscreen')
- self.drawnameandnumber(bmp)
- wxSplashScreen.__init__(self, bmp, wxSPLASH_CENTRE_ON_SCREEN | wxSPLASH_TIMEOUT, time, None, -1)
- EVT_CLOSE(self, self.OnClose)
- self.Show()
- app.Yield(True)
- thesplashscreen = self
- return None
-
- self.goforit()
-
-
- def drawnameandnumber(self, bmp):
- dc = wxMemoryDC()
- dc.SelectObject(bmp)
- x = 23
- y = 40
- if False:
- str = version.name
- dc.SetTextForeground(wxNamedColour('MEDIUMORCHID4'))
- dc.SetFont(self._gimmethedamnsizeirequested(25, wxROMAN, wxNORMAL, wxNORMAL))
- (w, h) = dc.GetTextExtent(str)
- dc.DrawText(str, x, y)
- y += h + 0
-
- x = 58
- y = 127
- str = version.versionstring
- dc.SetTextForeground(wxNamedColour('MEDIUMBLUE'))
- dc.SetFont(self._gimmethedamnsizeirequested(15, wxROMAN, wxNORMAL, wxNORMAL))
- (w, h) = dc.GetTextExtent(str)
- dc.DrawText(str, x + 10, y)
- y += h + 0
- dc.SelectObject(wxNullBitmap)
-
-
- def _gimmethedamnsizeirequested(self, ps, family, style, weight):
- if IsGtk():
- ps = ps * 1.6000000000000001
-
- font = wxTheFontList.FindOrCreateFont(ps, family, style, weight)
- return font
-
-
- def goforit(self):
- self.app.makemainwindow()
-
-
- def OnClose(self, evt):
- self.goforit()
- evt.Skip()
-
-
- wxEVT_CALLBACK = None
-
- class MainApp(wxApp):
-
- def __init__(self, *_):
- wxApp.__init__(self, redirect = False, useBestVisual = True)
- sys.setcheckinterval(100)
-
-
- def OnInit(self):
- global mainthreadid, wxEVT_CALLBACK
- self.made = False
- wxInitAllImageHandlers()
- colourdb.updateColourDB()
- mainthreadid = thread.get_ident()
- cfgstr = 'bitpim'
- if IsMSWindows():
- cfgstr = 'BitPim'
-
- self.config = wxConfig(cfgstr, style = wxCONFIG_USE_LOCAL_FILE)
- self.SetAppName(cfgstr)
- self.SetVendorName(cfgstr)
- self.setuphelp()
- wxEVT_CALLBACK = wxNewEventType()
- MySplashScreen(self, self.config)
- return True
-
-
- def setuphelp(self):
- wxFileSystem_AddHandler = wxFileSystem_AddHandler
- wxZipFSHandler = wxZipFSHandler
- import wxPython.wx
- import wxPython.html as wxPython
- wxHtmlHelpController = wxHtmlHelpController
- import wxPython.htmlhelp
- wxFileSystem_AddHandler(wxZipFSHandler())
- self.helpcontroller = wxHtmlHelpController()
- self.helpcontroller.AddBook(gethelpfilename() + '.htb')
- self.helpcontroller.UseConfig(self.config, 'help')
-
-
- def displayhelpid(self, id):
- self.helpcontroller.Display(id)
-
-
- def makemainwindow(self):
- if self.made:
- return None
-
- self.made = True
- frame = MainWindow(None, -1, 'BitPim', self.config)
- frame.Connect(-1, -1, wxEVT_CALLBACK, frame.OnCallback)
- wt = WorkerThread()
- wt.setdispatch(frame)
- wt.setDaemon(1)
- wt.start()
- frame.wt = wt
- self.frame = frame
- self.SetTopWindow(frame)
- self.SetExitOnFrameDelete(True)
-
-
- def OnExit(self):
- sys.excepthook = sys.__excepthook__
- self.config.Flush()
-
-
-
- def run(*args):
- m = MainApp(*args)
- res = m.MainLoop()
- return res
-
-
- class MainWindow(wxFrame):
-
- def __init__(self, parent, id, title, config):
- wxFrame.__init__(self, parent, id, title, style = wxDEFAULT_FRAME_STYLE | wxNO_FULL_REPAINT_ON_RESIZE)
- sys.excepthook = Callback(self.excepthook)
- self.wt = None
- self.progressminorcb = Callback(self.OnProgressMinor)
- self.progressmajorcb = Callback(self.OnProgressMajor)
- self.logcb = Callback(self.OnLog)
- self.logdatacb = Callback(self.OnLogData)
- self.startbusycb = Callback(self.OnBusyStart)
- self.endbusycb = Callback(self.OnBusyEnd)
- self.wantlog = 1
- self.config = config
- self.progmajortext = ''
- self.lw = None
- self.lwdata = None
- self.filesystemwidget = None
- sb = guiwidgets.MyStatusBar(self)
- self.SetStatusBar(sb)
- menuBar = wxMenuBar()
- self.SetMenuBar(menuBar)
- menu = wxMenu()
- menu.Append(ID_FILEEXIT, 'E&xit', 'Close down this program')
- menuBar.Append(menu, '&File')
- menu = wxMenu()
- menu.Append(ID_EDITADDENTRY, 'Add...', 'Add an item')
- menu.Append(ID_EDITDELETEENTRY, 'Delete', 'Delete currently selected entry')
- if HasFullyFunctionalListView():
- menu.AppendSeparator()
- menu.Append(ID_FV_ICONS, 'View as Images', 'Show items as images')
- menu.Append(ID_FV_LIST, 'View As List', 'Show items as a report')
-
- menu.AppendSeparator()
- menu.Append(ID_EDITSETTINGS, '&Settings', 'Edit settings')
- menuBar.Append(menu, '&Edit')
- menu = wxMenu()
- menu.Append(ID_DATAGETPHONE, 'Get Phone &Data ...', 'Loads data from the phone')
- menu.Append(ID_DATASENDPHONE, '&Send Phone Data ...', 'Sends data to the phone')
- menuBar.Append(menu, '&Data')
- menu = wxMenu()
- menu.AppendCheckItem(ID_VIEWLOGDATA, 'View protocol logging', 'View protocol logging information')
- menu.AppendCheckItem(ID_VIEWFILESYSTEM, 'View filesystem', 'View filesystem on the phone')
- menuBar.Append(menu, '&View')
- menu = wxMenu()
- menu.Append(ID_HELPHELP, '&Help', 'Help for the panel you are looking at')
- menu.Append(ID_HELPTOUR, '&Tour', 'Tour of BitPim')
- menu.Append(ID_HELPCONTENTS, '&Contents', 'Table of contents for the online help')
- menu.AppendSeparator()
- menu.Append(ID_HELPABOUT, '&About', 'Display program information')
- menuBar.Append(menu, '&Help')
- self.nb = wxNotebook(self, -1)
- self.phonewidget = guiwidgets.PhoneGrid(self, self.nb)
- self.nb.AddPage(self.phonewidget, 'PhoneBook')
- self.wallpaperwidget = guiwidgets.WallpaperView(self, self.nb)
- self.nb.AddPage(self.wallpaperwidget, 'Wallpaper')
- self.ringerwidget = guiwidgets.RingerView(self, self.nb)
- self.nb.AddPage(self.ringerwidget, 'Ringers')
- self.calendarwidget = guiwidgets.Calendar(self, self.nb)
- self.nb.AddPage(self.calendarwidget, 'Calendar')
- self.tb = self.CreateToolBar(wxTB_HORIZONTAL | wxTB_TEXT)
- sz = self.tb.GetToolBitmapSize()
- if sz[0] < 10 or sz[0] > 100:
- sz = wxSize(32, 32)
-
- if HasFullyFunctionalListView():
- self.tb.AddLabelTool(ID_FV_LIST, 'List', wxArtProvider_GetBitmap(wxART_REPORT_VIEW, wxART_TOOLBAR, sz), shortHelp = 'List View', longHelp = 'View items as a list')
- self.tb.AddLabelTool(ID_FV_ICONS, 'Images', wxArtProvider_GetBitmap(wxART_LIST_VIEW, wxART_TOOLBAR, sz), shortHelp = 'Icon View', longHelp = 'View items as icons')
- self.tb.AddSeparator()
-
- self.tb.AddLabelTool(ID_EDITADDENTRY, 'Add', wxArtProvider_GetBitmap(wxART_ADD_BOOKMARK, wxART_TOOLBAR, sz), shortHelp = 'Add', longHelp = 'Add an item')
- self.tb.AddLabelTool(ID_EDITDELETEENTRY, 'Delete', wxArtProvider_GetBitmap(wxART_DEL_BOOKMARK, wxART_TOOLBAR, sz), shortHelp = 'Delete', longHelp = 'Delete item')
- self.tb.Realize()
- self.lw = guiwidgets.LogWindow(self.nb)
- self.nb.AddPage(self.lw, 'Log')
- self.dlggetphone = guiwidgets.GetPhoneDialog(self, 'Get Data from Phone')
- self.dlgsendphone = guiwidgets.SendPhoneDialog(self, 'Send Data to Phone')
- EVT_MENU(self, ID_FILEEXIT, self.OnExit)
- EVT_MENU(self, ID_EDITSETTINGS, self.OnEditSettings)
- EVT_MENU(self, ID_DATAGETPHONE, self.OnDataGetPhone)
- EVT_MENU(self, ID_DATASENDPHONE, self.OnDataSendPhone)
- EVT_MENU(self, ID_VIEWLOGDATA, self.OnViewLogData)
- EVT_MENU(self, ID_VIEWFILESYSTEM, self.OnViewFilesystem)
- EVT_MENU(self, ID_FV_LIST, self.OnFileViewList)
- EVT_MENU(self, ID_FV_ICONS, self.OnFileViewIcons)
- EVT_MENU(self, ID_EDITADDENTRY, self.OnEditAddEntry)
- EVT_MENU(self, ID_EDITDELETEENTRY, self.OnEditDeleteEntry)
- EVT_MENU(self, ID_HELPABOUT, self.OnHelpAbout)
- EVT_MENU(self, ID_HELPHELP, self.OnHelpHelp)
- EVT_MENU(self, ID_HELPCONTENTS, self.OnHelpContents)
- EVT_MENU(self, ID_HELPTOUR, self.OnHelpTour)
- EVT_NOTEBOOK_PAGE_CHANGED(self, -1, self.OnNotebookPageChanged)
- EVT_CLOSE(self, self.OnClose)
- self.Show()
- if min(self.GetSize()) < 250:
- self.SetSize((640, 480))
-
- if thesplashscreen is not None:
- wxSafeYield()
-
- try:
- thesplashscreen.Show(False)
-
-
- if self.config.ReadInt('firstrun', True):
- self.config.WriteInt('firstrun', False)
- self.config.Flush()
- wxCallAfter(self.OnHelpTour)
-
- self.configdlg = guiwidgets.ConfigDialog(self, self)
- if self.configdlg.needconfig():
- if self.configdlg.ShowModal() != wxID_OK:
- self.OnExit()
-
-
- self.configdlg.updatevariables()
- lv = self.config.ReadInt('viewlogdata', 0)
- if lv:
- menuBar.Check(ID_VIEWLOGDATA, 1)
- self.OnViewLogData(None)
-
- fv = self.config.ReadInt('viewfilesystem', 0)
- if fv:
- menuBar.Check(ID_VIEWFILESYSTEM, 1)
- self.OnViewFilesystem(None)
- wxYield()
-
- self.OnPopulateEverythingFromDisk()
- pg = self.config.Read('viewnotebookpage', '')
- sel = 0
- if len(pg):
- for i in range(self.nb.GetPageCount()):
- if pg == self.nb.GetPageText(i):
- sel = i
- break
- continue
-
-
- if sel == self.nb.GetSelection():
- self.OnNotebookPageChanged()
- else:
- self.nb.SetSelection(sel)
- EVT_CLOSE(self, self.OnClose)
-
-
- def OnExit(self, _ = None):
- self.Close()
-
-
- def OnClose(self, event):
- if not (self.wt):
- self.Destroy()
- return None
-
- if event.CanVeto():
- pass
-
- self.MakeCall(Request(self.wt.exit), Callback(self.OnCloseResults))
-
-
- def OnCloseResults(self, exception, _):
- self.Destroy()
- wxGetApp().ExitMainLoop()
-
-
- def OnHelpAbout(self, _):
- import version
- str = 'BitPim Version ' + version.versionstring
- str += '\n\n'
- if len(version.extrainfo):
- str += version.extrainfo + '\n\n'
-
- str += version.contact
- d = wxMessageDialog(self, str, 'About BitPim', wxOK | wxICON_INFORMATION)
- d.ShowModal()
- d.Destroy()
-
-
- def OnHelpHelp(self, _):
- text = re.sub('[^A-Za-z]', '', self.nb.GetPageText(self.nb.GetSelection()))
- wxGetApp().displayhelpid(getattr(helpids, 'ID_TAB_' + text.upper()))
-
-
- def OnHelpContents(self, _):
- wxGetApp().helpcontroller.DisplayContents()
-
-
- def OnHelpTour(self, _ = None):
- wxGetApp().displayhelpid(helpids.ID_TOUR)
-
-
- def OnViewLogData(self, _):
- logdatatitle = 'Protocol Log'
- if self.lwdata is None:
- self.lwdata = guiwidgets.LogWindow(self.nb)
- self.nb.AddPage(self.lwdata, logdatatitle)
- self.config.WriteInt('viewlogdata', 1)
- else:
- self.lwdata = None
- for i in range(0, self.nb.GetPageCount()):
- if self.nb.GetPageText(i) == logdatatitle:
- self.nb.DeletePage(i)
- break
- continue
-
- self.config.WriteInt('viewlogdata', 0)
-
-
- def OnViewFilesystem(self, _):
- logtitle = 'Log'
- fstitle = 'Filesystem'
- if self.filesystemwidget is None:
- for i in range(0, self.nb.GetPageCount()):
- if self.nb.GetPageText(i) == logtitle:
- self.filesystemwidget = FileSystemView(self, self.nb, id = 97)
- self.nb.InsertPage(i, self.filesystemwidget, fstitle, True)
- self.config.WriteInt('viewfilesystem', True)
- return None
- continue
-
- return None
-
- self.filesystemwidget = None
- for i in range(0, self.nb.GetPageCount()):
- if self.nb.GetPageText(i) == fstitle:
- self.nb.DeletePage(i)
- self.config.WriteInt('viewfilesystem', False)
- return None
- continue
-
-
-
- def OnDataGetPhone(self, _):
- dlg = self.dlggetphone
- if dlg.ShowModal() != wxID_OK:
- return None
-
- self.MakeCall(Request(self.wt.getdata, dlg), Callback(self.OnDataGetPhoneResults))
-
-
- def OnDataGetPhoneResults(self, exception, results):
- if self.HandleException(exception):
- return None
-
- self.OnLog(`results.keys()`)
- self.OnLog(`results['sync']`)
- if results['sync'].has_key('phonebook'):
- v = results['sync'].has_key('phonebook')
- if v == 'MERGE':
- raise Exception('Not implemented')
-
- self.phonewidget.clear()
- self.phonewidget.populatefs(results)
- self.phonewidget.populate(results)
-
- if results['sync'].has_key('wallpaper'):
- v = results['sync'].has_key('wallpaper')
- if v == 'MERGE':
- raise Exception('Not implemented')
-
- self.wallpaperwidget.populatefs(results)
- self.wallpaperwidget.populate(results)
-
- if results['sync'].has_key('ringtone'):
- v = results['sync'].has_key('ringtone')
- if v == 'MERGE':
- raise Exception('Not implemented')
-
- self.ringerwidget.populatefs(results)
- self.ringerwidget.populate(results)
-
- if results['sync'].has_key('calendar'):
- v = results['sync'].has_key('calendar')
- if v == 'MERGE':
- raise Exception('Not implemented')
-
- self.calendarwidget.populatefs(results)
- self.calendarwidget.populate(results)
-
-
-
- def OnDataSendPhone(self, _):
- dlg = self.dlgsendphone
- if dlg.ShowModal() != wxID_OK:
- return None
-
- data = { }
- todo = []
- funcscb = []
- v = dlg.GetCalendarSetting()
- if v != dlg.NOTREQUESTED:
- merge = True
- if v == dlg.OVERWRITE:
- merge = False
-
- self.calendarwidget.getdata(data)
- todo.append((self.wt.writecalendar, 'Calendar', merge))
- funcscb.append(self.calendarwidget.populatefs)
- funcscb.append(self.calendarwidget.populate)
-
- v = dlg.GetWallpaperSetting()
- if v != dlg.NOTREQUESTED:
- merge = True
- if v == dlg.OVERWRITE:
- merge = False
-
- self.wallpaperwidget.getdata(data)
- todo.append((self.wt.writewallpaper, 'Wallpaper', merge))
- funcscb.append(self.wallpaperwidget.populatefs)
- funcscb.append(self.wallpaperwidget.populate)
-
- v = dlg.GetRingtoneSetting()
- if v != dlg.NOTREQUESTED:
- merge = True
- if v == dlg.OVERWRITE:
- merge = False
-
- self.ringerwidget.getdata(data)
- todo.append((self.wt.writeringtone, 'Ringtone', merge))
- funcscb.append(self.ringerwidget.populatefs)
- funcscb.append(self.ringerwidget.populate)
-
- v = dlg.GetPhoneBookSetting()
- if v != dlg.NOTREQUESTED:
- if v == dlg.OVERWRITE:
- self.phonewidget.getdata(data)
- todo.append((self.wt.writephonebook, 'Phonebook'))
-
-
- self.MakeCall(Request(self.wt.senddata, data, todo), Callback(self.OnDataSendPhoneResults, funcscb))
-
-
- def OnDataSendPhoneResults(self, funcscb, exception, results):
- if self.HandleException(exception):
- return None
-
- for f in funcscb:
- f(results)
-
-
-
- def OnPopulateEverythingFromDisk(self, _ = None):
- results = { }
- self.phonewidget.getfromfs(results)
- self.wallpaperwidget.getfromfs(results)
- self.ringerwidget.getfromfs(results)
- self.calendarwidget.getfromfs(results)
- self.phonewidget.populate(results)
- self.wallpaperwidget.populate(results)
- self.ringerwidget.populate(results)
- self.calendarwidget.populate(results)
-
-
- def OnEditSettings(self, _ = None):
- if wxIsBusy():
- wxMessageBox("BitPim is busy. You can't change settings until it has finished talking to your phone.", 'BitPim is busy.', wxOK | wxICON_EXCLAMATION)
- else:
- self.configdlg.ShowModal()
-
-
- def OnNotebookPageChanged(self, _ = None):
- text = self.nb.GetPageText(self.nb.GetSelection())
- if text is not None:
- self.config.Write('viewnotebookpage', text)
-
- widget = self.nb.GetPage(self.nb.GetSelection())
- if widget is self.ringerwidget or widget is self.wallpaperwidget:
- enablefv = True
- else:
- enablefv = False
- if widget is self.ringerwidget and widget is self.wallpaperwidget or widget is self.phonewidget:
- enableedit = True
- else:
- enableedit = False
- if HasFullyFunctionalListView():
- self.GetToolBar().EnableTool(ID_FV_ICONS, enablefv)
- self.GetToolBar().EnableTool(ID_FV_LIST, enablefv)
-
- self.GetToolBar().EnableTool(ID_EDITADDENTRY, enableedit)
- self.GetToolBar().EnableTool(ID_EDITDELETEENTRY, enableedit)
- if HasFullyFunctionalListView():
- self.GetMenuBar().Enable(ID_FV_ICONS, enablefv)
- self.GetMenuBar().Enable(ID_FV_LIST, enablefv)
-
- self.GetMenuBar().Enable(ID_EDITADDENTRY, enableedit)
- self.GetMenuBar().Enable(ID_EDITDELETEENTRY, enableedit)
-
-
- def OnFileViewList(self, _):
- self.nb.GetPage(self.nb.GetSelection()).setlistview()
-
-
- def OnFileViewIcons(self, _):
- self.nb.GetPage(self.nb.GetSelection()).seticonview()
-
-
- def OnEditAddEntry(self, evt):
- self.nb.GetPage(self.nb.GetSelection()).OnAdd(evt)
-
-
- def OnEditDeleteEntry(self, evt):
- self.nb.GetPage(self.nb.GetSelection()).OnDelete(evt)
-
-
- def OnBusyStart(self):
- self.SetStatusText('BUSY')
- wxBeginBusyCursor(wxStockCursor(wxCURSOR_ARROWWAIT))
-
-
- def OnBusyEnd(self):
- wxEndBusyCursor()
- self.SetStatusText('Ready')
- self.OnProgressMajor(0, 1)
-
-
- def OnProgressMinor(self, pos, max, desc = ''):
- self.GetStatusBar().progressminor(pos, max, desc)
-
-
- def OnProgressMajor(self, pos, max, desc = ''):
- self.GetStatusBar().progressmajor(pos, max, desc)
-
-
- def OnLog(self, str):
- self.lw.log(str)
- if self.lwdata is not None:
- self.lwdata.log(str)
-
-
-
- def OnLogData(self, str, data):
- if self.lwdata is not None:
- self.lwdata.logdata(str, data)
-
-
-
- def excepthook(self, type, value, traceback):
- value.gui_exc_info = (type, value, traceback)
- self.HandleException(value)
-
-
- def HandleException(self, exception):
- if exception is None:
- return False
-
- text = None
- title = None
- style = None
- if isinstance(exception, common.CommsDeviceNeedsAttention):
- text = '%s: %s' % (exception.device, exception.message)
- title = 'Device needs attention - ' + exception.device
- style = wxOK | wxICON_INFORMATION
-
- help = lambda _: wxGetApp().displayhelpid(helpids.ID_DEVICE_NEEDS_ATTENTION)
- elif isinstance(exception, common.CommsOpenFailure):
- text = '%s: %s' % (exception.device, exception.message)
- title = 'Failed to open communications - ' + exception.device
- style = wxOK | wxICON_INFORMATION
-
- help = lambda _: wxGetApp().displayhelpid(helpids.ID_FAILED_TO_OPEN_DEVICE)
- elif isinstance(exception, common.AutoPortsFailure):
- text = exception.message
- title = 'Failed to automatically detect port'
- style = wxOK | wxICON_INFORMATION
-
- help = lambda _: wxGetApp().displayhelpid(helpids.ID_FAILED_TO_AUTODETECT_PORT)
-
- if text is not None:
- dlg = guiwidgets.AlertDialogWithHelp(self, text, title, help, style = style)
- dlg.ShowModal()
- dlg.Destroy()
- return True
-
- e = guiwidgets.ExceptionDialog(self, exception)
- e.ShowModal()
- e.Destroy()
- return True
-
-
- def OnCallback(self, event):
- event()
-
-
- def MakeCall(self, request, cbresult):
- self.wt.q.put((request, cbresult))
-
-
-
- class WorkerThread(WorkerThreadFramework):
-
- def __init__(self):
- WorkerThreadFramework.__init__(self)
- self.commphone = None
-
-
- def exit(self):
- for i in range(0, 0):
- self.progressmajor(i, 2, 'Shutting down helper thread')
- time.sleep(1)
-
- self.log('helper thread shut down')
- raise SystemExit('helper thread shutdown')
-
-
- def clearcomm(self):
- if self.commphone is None:
- return None
-
- self.commphone.close()
- self.commphone = None
-
-
- def setupcomm(self):
- if self.commphone is None:
- import commport
- if self.dispatchto.commportsetting is None or len(self.dispatchto.commportsetting) == 0:
- raise common.CommsNeedConfiguring('LGVX4400', 'Comm port not configured')
-
- if self.dispatchto.commportsetting == 'auto':
- autofunc = comdiagnose.autoguessports
- else:
- autofunc = None
- comcfg = self.dispatchto.commparams
- comport = commport.CommConnection(self, self.dispatchto.commportsetting, autolistfunc = autofunc, baud = comcfg['baud'], timeout = comcfg['timeout'], hardwareflow = comcfg['hardwareflow'], softwareflow = comcfg['softwareflow'], configparameters = comcfg)
-
- try:
- import com_lgvx4400
- self.commphone = com_lgvx4400.Phone(self, comport)
- except Exception:
- _ = None
- comport.close()
- except:
- None<EXCEPTION MATCH>Exception
-
-
- None<EXCEPTION MATCH>Exception
-
-
- def getdata(self, req):
- self.setupcomm()
- results = { }
- willcall = []
- sync = { }
- for i in ((req.GetPhoneBookSetting, self.commphone.getphonebook, 'Phone Book', 'phonebook'), (req.GetCalendarSetting, self.commphone.getcalendar, 'Calendar', 'calendar'), (req.GetWallpaperSetting, self.commphone.getwallpapers, 'Wallpaper', 'wallpaper'), (req.GetRingtoneSetting, self.commphone.getringtones, 'Ringtones', 'ringtone')):
- st = i[0]()
- if st == req.MERGE:
- sync[i[3]] = 'MERGE'
- willcall.append(i)
- continue
- if st == req.OVERWRITE:
- sync[i[3]] = 'OVERWRITE'
- willcall.append(i)
- continue
-
- results['sync'] = sync
- count = 0
- for i in willcall:
- self.progressmajor(count, len(willcall), i[2])
- count += 1
- i[1](results)
-
- return results
-
-
- def senddata(self, dict, todo):
- count = 0
- for xx in todo:
- func = xx[0]
- desc = xx[1]
- args = [
- dict]
- if len(xx) > 2:
- args.extend(xx[2:])
-
- self.progressmajor(count, len(todo), desc)
- apply(func, args)
- count += 1
-
- return dict
-
-
- def writewallpaper(self, data, merge):
- self.setupcomm()
- return self.commphone.savewallpapers(data, merge)
-
-
- def writeringtone(self, data, merge):
- self.setupcomm()
- return self.commphone.saveringtones(data, merge)
-
-
- def writephonebook(self, data):
- self.setupcomm()
- return self.commphone.savephonebook(data)
-
-
- def writecalendar(self, data, merge):
- self.setupcomm()
- return self.commphone.savecalendar(data, merge)
-
-
- def dirlisting(self, path, recurse = 0):
- self.setupcomm()
- return self.commphone.getfilesystem(path, recurse)
-
-
- def getfile(self, path):
- self.setupcomm()
- return self.commphone.getfilecontents(path)
-
-
- def rmfile(self, path):
- self.setupcomm()
- return self.commphone.rmfile(path)
-
-
- def writefile(self, path, contents):
- self.setupcomm()
- return self.commphone.writefile(path, contents)
-
-
- def mkdir(self, path):
- self.setupcomm()
- return self.commphone.mkdir(path)
-
-
- def rmdir(self, path):
- self.setupcomm()
- return self.commphone.rmdir(path)
-
-
- def rmdirs(self, path):
- self.setupcomm()
- self.progressminor(0, 1, 'Listing child files and directories')
- all = self.dirlisting(path, 100)
- keys = all.keys()
- keys.sort()
- keys.reverse()
- count = 0
- for k in keys:
- self.progressminor(count, len(keys), 'Deleting ' + k)
- count += 1
- if all[k]['type'] == 'directory':
- self.rmdir(k)
- continue
- self.rmfile(k)
-
- self.rmdir(path)
-
-
- def getbackup(self, path, recurse = 0):
- self.setupcomm()
- self.progressmajor(0, 0, 'Listing files')
- files = self.dirlisting(path, recurse)
- if path == '/' or path == '':
- strip = 0
- else:
- strip = len(path) + 1
- keys = files.keys()
- keys.sort()
- op = cStringIO.StringIO()
- zip = zipfile.ZipFile(op, 'w', zipfile.ZIP_DEFLATED)
- count = 0
- for k in keys:
- count += 1
- if files[k]['type'] != 'file':
- continue
-
- self.progressmajor(count, len(keys) + 1, 'Getting files')
- contents = self.getfile(k)
- zi = zipfile.ZipInfo()
- zi.filename = k[strip:]
- if files[k]['date'][0] == 0:
- zi.date_time = (0, 0, 0, 0, 0, 0)
- else:
- zi.date_time = time.gmtime(files[k]['date'][0])[:6]
- zi.compress_type = zipfile.ZIP_DEFLATED
- zip.writestr(zi, contents)
-
- zip.close()
- return op.getvalue()
-
-
- def restorefiles(self, files):
- self.setupcomm()
- results = []
- seendirs = []
- count = 0
- for name, contents in files:
- self.progressmajor(count, len(files), 'Restoring files')
- count += 1
- d = dirname(name)
- if d not in seendirs:
- seendirs.append(d)
- self.commphone.mkdirs(d)
-
- self.writefile(name, contents)
- results.append((True, name))
-
- return results
-
-
-
- class FileSystemView(wxTreeListCtrl):
-
- def GetFirstChild(self, *_args, **_kwargs):
- val = gizmosc.wxTreeListCtrl_GetFirstChild(self, *_args, **_kwargs)
- return val
-
-
- def GetNextChild(self, *_args, **_kwargs):
- val = gizmosc.wxTreeListCtrl_GetNextChild(self, *_args, **_kwargs)
- return val
-
-
- def HitTest(self, point):
- w = self.GetMainWindow()
- return gizmosc.wxTreeListCtrl_HitTest(self, self.ScreenToClient(w.ClientToScreen(point)))
-
-
- def __init__(self, mainwindow, parent, id = -1):
- self.datacolumn = False
- wxTreeListCtrl.__init__(self, parent, id, style = wxWANTS_CHARS | wxTR_DEFAULT_STYLE)
- self.AddColumn('Name')
- self.AddColumn('Size')
- self.AddColumn('Date')
- self.SetMainColumn(0)
- self.SetColumnWidth(0, 300)
- self.SetColumnWidth(2, 200)
- if self.datacolumn:
- self.AddColumn('Extra Stuff')
- self.SetColumnWidth(3, 400)
-
- self.SetColumnAlignment(1, wxLIST_FORMAT_RIGHT)
- self.mainwindow = mainwindow
- self.root = self.AddRoot('/')
- self.SetPyData(self.root, None)
- self.SetItemHasChildren(self.root, True)
- self.SetPyData(self.AppendItem(self.root, 'Retrieving...'), None)
- self.dirhash = {
- '': 1 }
- EVT_TREE_ITEM_EXPANDED(self, id, self.OnItemExpanded)
- EVT_TREE_ITEM_ACTIVATED(self, id, self.OnItemActivated)
- self.filemenu = wxMenu()
- self.filemenu.Append(ID_FV_SAVE, 'Save ...')
- self.filemenu.Append(ID_FV_HEXVIEW, 'Hexdump')
- self.filemenu.AppendSeparator()
- self.filemenu.Append(ID_FV_DELETE, 'Delete')
- self.filemenu.Append(ID_FV_OVERWRITE, 'Overwrite ...')
- self.dirmenu = wxMenu()
- self.dirmenu.Append(ID_FV_NEWSUBDIR, 'Make subdirectory ...')
- self.dirmenu.Append(ID_FV_NEWFILE, 'New File ...')
- self.dirmenu.AppendSeparator()
- self.dirmenu.Append(ID_FV_BACKUP, 'Backup directory ...')
- self.dirmenu.Append(ID_FV_BACKUP_TREE, 'Backup entire tree ...')
- self.dirmenu.Append(ID_FV_RESTORE, 'Restore ...')
- self.dirmenu.AppendSeparator()
- self.dirmenu.Append(ID_FV_REFRESH, 'Refresh')
- self.dirmenu.AppendSeparator()
- self.dirmenu.Append(ID_FV_DELETE, 'Delete')
- EVT_MENU(self.filemenu, ID_FV_SAVE, self.OnFileSave)
- EVT_MENU(self.filemenu, ID_FV_HEXVIEW, self.OnHexView)
- EVT_MENU(self.filemenu, ID_FV_DELETE, self.OnFileDelete)
- EVT_MENU(self.filemenu, ID_FV_OVERWRITE, self.OnFileOverwrite)
- EVT_MENU(self.dirmenu, ID_FV_NEWSUBDIR, self.OnNewSubdir)
- EVT_MENU(self.dirmenu, ID_FV_NEWFILE, self.OnNewFile)
- EVT_MENU(self.dirmenu, ID_FV_DELETE, self.OnDirDelete)
- EVT_MENU(self.dirmenu, ID_FV_BACKUP, self.OnBackupDirectory)
- EVT_MENU(self.dirmenu, ID_FV_BACKUP_TREE, self.OnBackupTree)
- EVT_MENU(self.dirmenu, ID_FV_RESTORE, self.OnRestore)
- EVT_MENU(self.dirmenu, ID_FV_REFRESH, self.OnDirRefresh)
- EVT_RIGHT_DOWN(self.GetMainWindow(), self.OnRightDown)
- EVT_RIGHT_UP(self.GetMainWindow(), self.OnRightUp)
-
-
- def OnRightUp(self, event):
- pt = event.GetPosition()
- (item, flags, unknown) = self.HitTest(pt)
- if flags:
- path = self.itemtopath(item)
- if path in self.dirhash:
- if self.dirhash[path]:
- self.PopupMenu(self.dirmenu, pt)
- return None
-
-
- self.PopupMenu(self.filemenu, pt)
-
-
-
- def OnRightDown(self, event):
- pt = event.GetPosition()
- (item, flags, unknown) = self.HitTest(pt)
-
- try:
- self.SelectItem(item)
- except:
- pass
-
-
-
- def OnItemActivated(self, _):
- item = self.GetSelection()
- path = self.itemtopath(item)
- if path in self.dirhash:
- if self.dirhash[path]:
- return None
-
-
- self.OnHexView(self)
-
-
- def OnItemExpanded(self, event):
- item = event.GetItem()
- self.OnDirListing(self.itemtopath(item))
-
-
- def OnDirListing(self, path):
- mw = self.mainwindow
- mw.MakeCall(Request(mw.wt.dirlisting, path), Callback(self.OnDirListingResults, path))
-
-
- def OnDirListingResults(self, path, exception, result):
- mw = self.mainwindow
- if mw.HandleException(exception):
- return None
-
- item = self.pathtoitem(path)
- l = []
- cookie = id(result) - 10000
- (child, cookie) = self.GetFirstChild(item, cookie)
- for dummy in range(0, self.GetChildrenCount(item, False)):
- l.append(child)
- (child, cookie) = self.GetNextChild(item, cookie)
-
- for file in result:
- f = basename(file)
- found = None
- for i in l:
- if self.GetItemText(i) == f:
- found = i
- break
- continue
-
- made = 0
- if found is None:
- found = self.AppendItem(item, f)
- self.SetPyData(found, None)
- made = 1
-
- if result[file]['type'] == 'file':
- self.dirhash[result[file]['name']] = 0
- self.SetItemHasChildren(found, False)
- self.SetItemText(found, `result[file]['size']`, 1)
- self.SetItemText(found, ' ' + result[file]['date'][1], 2)
- if self.datacolumn:
- self.SetItemText(found, result[file]['data'], 3)
-
- self.datacolumn
- self.dirhash[result[file]['name']] = 1
- self.SetItemHasChildren(found, True)
- if made:
- self.SetPyData(self.AppendItem(found, 'Retrieving...'), None)
- continue
-
- for i in l:
- if not result.has_key(self.itemtopath(i)):
- self.Delete(i)
- continue
-
- self.SortChildren(item)
-
-
- def OnFileSave(self, _):
- path = self.itemtopath(self.GetSelection())
- mw = self.mainwindow
- mw.MakeCall(Request(mw.wt.getfile, path), Callback(self.OnFileSaveResults, path))
-
-
- def OnFileSaveResults(self, path, exception, contents):
- mw = self.mainwindow
- if mw.HandleException(exception):
- return None
-
- bn = basename(path)
- ext = getextension(bn)
- if len(ext):
- ext = '%s files (*.%s)|*.%s' % (ext.upper(), ext, ext)
- else:
- ext = 'All files|*'
- dlg = wxFileDialog(self, 'Save File As', defaultFile = bn, wildcard = ext, style = wxSAVE | wxOVERWRITE_PROMPT | wxCHANGE_DIR)
- if dlg.ShowModal() == wxID_OK:
- f = open(dlg.GetPath(), 'wb')
- f.write(contents)
- f.close()
-
- dlg.Destroy()
-
-
- def OnHexView(self, _):
- path = self.itemtopath(self.GetSelection())
- mw = self.mainwindow
- mw.MakeCall(Request(mw.wt.getfile, path), Callback(self.OnHexViewResults, path))
-
-
- def OnHexViewResults(self, path, exception, result):
- mw = self.mainwindow
- if mw.HandleException(exception):
- return None
-
- dlg = guiwidgets.MyFixedScrolledMessageDialog(self, common.datatohexstring(result), path + ' Contents', helpids.ID_HEXVIEW_DIALOG)
- dlg.Show()
-
-
- def OnFileDelete(self, _):
- path = self.itemtopath(self.GetSelection())
- mw = self.mainwindow
- mw.MakeCall(Request(mw.wt.rmfile, path), Callback(self.OnFileDeleteResults, dirname(path)))
-
-
- def OnFileDeleteResults(self, parentdir, exception, _):
- mw = self.mainwindow
- if mw.HandleException(exception):
- return None
-
- self.OnDirListing(parentdir)
-
-
- def OnFileOverwrite(self, _):
- path = self.itemtopath(self.GetSelection())
- dlg = wxFileDialog(self, style = wxOPEN | wxHIDE_READONLY | wxCHANGE_DIR)
- if dlg.ShowModal() != wxID_OK:
- dlg.Destroy()
- return None
-
- infile = dlg.GetPath()
- f = open(infile, 'rb')
- contents = f.read()
- f.close()
- mw = self.mainwindow
- mw.MakeCall(Request(mw.wt.writefile, path, contents), Callback(self.OnFileOverwriteResults, dirname(path)))
- dlg.Destroy()
-
-
- def OnFileOverwriteResults(self, parentdir, exception, _):
- mw = self.mainwindow
- if mw.HandleException(exception):
- return None
-
- self.OnDirListing(parentdir)
-
-
- def OnNewSubdir(self, _):
- dlg = wxTextEntryDialog(self, 'Subdirectory name?', 'Create Subdirectory', 'newfolder')
- if dlg.ShowModal() != wxID_OK:
- dlg.Destroy()
- return None
-
- parent = self.itemtopath(self.GetSelection())
- if len(parent):
- path = parent + '/' + dlg.GetValue()
- else:
- path = dlg.GetValue()
- mw = self.mainwindow
- mw.MakeCall(Request(mw.wt.mkdir, path), Callback(self.OnNewSubdirResults, parent))
- dlg.Destroy()
-
-
- def OnNewSubdirResults(self, parentdir, exception, _):
- mw = self.mainwindow
- if mw.HandleException(exception):
- return None
-
- self.OnDirListing(parentdir)
-
-
- def OnNewFile(self, _):
- parent = self.itemtopath(self.GetSelection())
- dlg = wxFileDialog(self, style = wxOPEN | wxHIDE_READONLY | wxCHANGE_DIR)
- if dlg.ShowModal() != wxID_OK:
- dlg.Destroy()
- return None
-
- infile = dlg.GetPath()
- f = open(infile, 'rb')
- contents = f.read()
- f.close()
- if len(parent):
- path = parent + '/' + os.path.basename(dlg.GetPath())
- else:
- path = os.path.basename(dlg.GetPath())
- mw = self.mainwindow
- mw.MakeCall(Request(mw.wt.writefile, path, contents), Callback(self.OnNewFileResults, parent))
- dlg.Destroy()
-
-
- def OnNewFileResults(self, parentdir, exception, _):
- mw = self.mainwindow
- if mw.HandleException(exception):
- return None
-
- self.OnDirListing(parentdir)
-
-
- def OnDirDelete(self, _):
- path = self.itemtopath(self.GetSelection())
- mw = self.mainwindow
- mw.MakeCall(Request(mw.wt.rmdirs, path), Callback(self.OnDirDeleteResults, dirname(path)))
-
-
- def OnDirDeleteResults(self, parentdir, exception, _):
- mw = self.mainwindow
- if mw.HandleException(exception):
- return None
-
- self.OnDirListing(parentdir)
-
-
- def OnBackupTree(self, _):
- self.OnBackup(recurse = 100)
-
-
- def OnBackupDirectory(self, _):
- self.OnBackup()
-
-
- def OnBackup(self, recurse = 0):
- path = self.itemtopath(self.GetSelection())
- mw = self.mainwindow
- mw.MakeCall(Request(mw.wt.getbackup, path, recurse), Callback(self.OnBackupResults, path))
-
-
- def OnBackupResults(self, path, exception, backup):
- mw = self.mainwindow
- if mw.HandleException(exception):
- return None
-
- bn = basename(path)
- if len(bn) < 1:
- bn = 'root'
-
- bn += '.zip'
- ext = 'Zip files|*.zip|All Files|*'
- dlg = wxFileDialog(self, 'Save File As', defaultFile = bn, wildcard = ext, style = wxSAVE | wxOVERWRITE_PROMPT | wxCHANGE_DIR)
- if dlg.ShowModal() == wxID_OK:
- f = open(dlg.GetPath(), 'wb')
- f.write(backup)
- f.close()
-
- dlg.Destroy()
-
-
- def OnRestore(self, _):
- ext = 'Zip files|*.zip|All Files|*'
- path = self.itemtopath(self.GetSelection())
- bn = basename(path)
- if len(bn) < 1:
- bn = 'root'
-
- bn += '.zip'
- ext = 'Zip files|*.zip|All Files|*'
- dlg = wxFileDialog(self, 'Open backup file', defaultFile = bn, wildcard = ext, style = wxOPEN | wxHIDE_READONLY | wxCHANGE_DIR)
- if dlg.ShowModal() != wxID_OK:
- return None
-
- name = dlg.GetPath()
- if not zipfile.is_zipfile(name):
- dlg = guiwidgets.AlertDialogWithHelp(self.mainwindow, name + ' is not a valid zipfile.', 'Zip file required', (lambda _: wxGetApp().displayhelpid(helpids.ID_NOT_A_ZIPFILE)), style = wxOK | wxICON_ERROR)
- dlg.ShowModal()
- dlg.Destroy()
- return None
-
- zipf = zipfile.ZipFile(name, 'r')
- xx = zipf.testzip()
- if xx is not None:
- dlg = guiwidgets.AlertDialogWithHelp(self.mainwindow, name + ' has corrupted contents. Use a repair utility to fix it', 'Zip file corrupted', (lambda _: wxGetApp().displayhelpid(helpids.ID_ZIPFILE_CORRUPTED)), style = wxOK | wxICON_ERROR)
- dlg.ShowModal()
- dlg.Destroy()
- return None
-
- dlg = RestoreDialog(self.mainwindow, 'Restore files', zipf, path, self.OnRestoreOK)
- dlg.Show(True)
-
-
- def OnRestoreOK(self, zipf, names, parentdir):
- if len(names) == 0:
- wxMessageBox("You didn't select any files to restore!", 'No files selected', wxOK | wxICON_EXCLAMATION)
- return None
-
- l = []
- for zipname, fsname in names:
- l.append((fsname, zipf.read(zipname)))
-
- mw = self.mainwindow
- mw.MakeCall(Request(mw.wt.restorefiles, l), Callback(self.OnRestoreResults, parentdir))
-
-
- def OnRestoreResults(self, parentdir, exception, results):
- mw = self.mainwindow
- if mw.HandleException(exception):
- return None
-
- ok = filter((lambda s: s[0]), results)
- fail = filter((lambda s: not s[0]), results)
- if len(parentdir):
- dirs = []
- for _, name in results:
- while len(name) > len(parentdir):
- name = dirname(name)
- if name not in dirs:
- dirs.append(name)
- continue
-
- dirs.sort()
- for d in dirs:
- self.OnDirListing(d)
-
-
- self.OnDirListing(parentdir)
- if len(ok) and len(fail) == 0:
- dlg = wxMessageDialog(mw, 'All files restored ok', 'All files restored', wxOK | wxICON_INFORMATION)
- dlg.Show(True)
- return None
-
- if len(fail) and len(ok) == 0:
- wxMessageBox('All files failed to restore', 'No files restored', wxOK | wxICON_ERROR)
- return None
-
- op = 'Failed to restore some files. Check the log for reasons.:\n\n'
- for s, n in fail:
- op += ' ' + n + '\n'
-
- wxMessageBox(op, 'Some restores failed', wxOK | wxICON_ERROR)
-
-
- def OnDirRefresh(self, _):
- path = self.itemtopath(self.GetSelection())
- self.OnDirListing(path)
-
-
- def itemtopath(self, item):
- if item == self.root:
- return ''
-
- res = self.GetItemText(item)
- while True:
- parent = self.GetItemParent(item)
- if parent == self.root:
- return res
-
- item = parent
- res = self.GetItemText(item) + '/' + res
- return ''
-
-
- def pathtoitem(self, path):
- if path == '':
- return self.root
-
- dirs = path.split('/')
- node = self.root
- for n in range(0, len(dirs)):
- cookie = id(node) - 10000
- foundnode = None
- (child, cookie) = self.GetFirstChild(node, cookie)
- for dummy in range(0, self.GetChildrenCount(node, False)):
- d = self.GetItemText(child)
- if d == dirs[n]:
- node = child
- foundnode = node
- break
-
- (child, cookie) = self.GetNextChild(node, cookie)
-
- if foundnode is not None:
- continue
-
- node = self.AppendItem(node, dirs[n])
- self.SetPyData(node, None)
-
- return node
-
-
-
- class RestoreDialog(wxDialog):
-
- def __init__(self, parent, title, zipf, path, okcb):
- wxDialog.__init__(self, parent, -1, title, style = wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
- vbs = wxBoxSizer(wxVERTICAL)
- vbs.Add(wxStaticText(self, -1, 'Choose files to restore'), 0, wxALIGN_CENTRE | wxALL, 5)
- nl = zipf.namelist()
- nl.sort()
- prefix = path
- if len(prefix) == '/' or prefix == '':
- prefix = ''
- else:
- prefix += '/'
- nnl = map((lambda i: prefix + i), nl)
- self.clb = wxCheckListBox(self, -1, choices = nnl, style = wxLB_SINGLE | wxLB_HSCROLL | wxLB_NEEDED_SB, size = wxSize(200, 300))
- for i in range(len(nnl)):
- self.clb.Check(i, True)
-
- vbs.Add(self.clb, 1, wxEXPAND | wxALL, 5)
- vbs.Add(wxStaticLine(self, -1, style = wxLI_HORIZONTAL), 0, wxEXPAND | wxALL, 5)
- vbs.Add(self.CreateButtonSizer(wxOK | wxCANCEL | wxHELP), 0, wxALIGN_CENTER | wxALL, 5)
- self.SetSizer(vbs)
- self.SetAutoLayout(True)
- vbs.Fit(self)
- EVT_BUTTON(self, wxID_HELP, (lambda _: wxGetApp().displayhelpid(helpids.ID_RESTOREDIALOG)))
- EVT_BUTTON(self, wxID_OK, self.OnOK)
- self.okcb = okcb
- self.zipf = zipf
- self.nl = zip(nl, nnl)
- self.path = path
-
-
- def OnOK(self, _):
- names = []
- for i in range(len(self.nl)):
- if self.clb.IsChecked(i):
- names.append(self.nl[i])
- continue
-
- self.okcb(self.zipf, names, self.path)
- self.Show(False)
- self.Destroy()
-
-
-
- def getextension(str):
- str = basename(str)
- if str.rfind('.') >= 0:
- return str[str.rfind('.') + 1:]
-
- return ''
-
-
- def basename(str):
- if str.rfind('/') < 0:
- return str
-
- return str[str.rfind('/') + 1:]
-
-
- def dirname(str):
- if str.rfind('/') < 0:
- return ''
-
- return str[:str.rfind('/')]
-
-
- def HasFullyFunctionalListView():
- if IsMSWindows():
- return True
-
- return False
-
-
- def IsMSWindows():
- return wxPlatform == '__WXMSW__'
-
-
- def IsGtk():
- return wxPlatform == '__WXGTK__'
-
-
- def getbitmap(name):
- for ext in ('', '.png', '.jpg'):
- if os.path.exists(getresourcefile(name + ext)):
- return wxImage(getresourcefile(name + ext)).ConvertToBitmap()
- continue
-
- print 'You need to make ' + name + '.png'
- return getbitmap('unknown')
-
-
- def getresourcefile(filename):
- return os.path.join(resourcedirectory, filename)
-
-
- def gethelpfilename():
- j = os.path.join
- paths = ((j(resourcedirectory, '..', 'help'), True), (resourcedirectory, False))
- for p, mention in paths:
- if os.path.isfile(j(p, 'bitpim.htb')):
- if mention:
- print 'Using help file from ' + p
-
- return j(p, 'bitpim')
- continue
-
-
- resourcedirectory = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), 'resources'))
-